package com.itany.shop.service.impl;

import com.itany.shop.dao.ProductDao;
import com.itany.shop.entity.Item;
import com.itany.shop.entity.Product;
import com.itany.shop.exception.ProductNotExistException;
import com.itany.shop.exception.RequestParameterException;
import com.itany.shop.exception.UserNotExistException;
import com.itany.shop.factory.ObjectFactory;
import com.itany.shop.service.CartService;
import com.itany.shop.vo.Cart;

import java.util.List;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年12月22日 9:21
 */
public class CartServiceImpl implements CartService {

    private ProductDao productDao = (ProductDao) ObjectFactory.getObject("productDao");

    @Override
    public void addCart(Cart cart, Integer id) throws UserNotExistException, RequestParameterException, ProductNotExistException {
        if (null == cart) {
            throw new UserNotExistException("请先登录");
        }
        if (null == id) {
            throw new RequestParameterException("请求参数有误");
        }

        //根据加入购物车的商品编号，查询最新的商品信息
        Product product = productDao.selectById(id);
        if (product == null) {
            throw new ProductNotExistException("该编号对应的商品不存在，请检查一下编号是否正确");
        }

        List<Item> items = cart.getItems();
        for (Item item : items) {
            //如果当前明细中商品的主键与加入购物车商品主键一致，表示该商品已经存在
            if (item.getProduct().getId().equals(product.getId())) {

                //明细数量=原有的明细数量+1
                item.setNum(item.getNum() + 1);

                //原有的明细的总价
                Double oldPrice = item.getPrice();
                // 明细总价=商品的单价*明细的数量
                item.setPrice(product.getPrice() * item.getNum());

                //现有的明细总价
                Double newPrice = item.getPrice();

                //购物车总价=原来的总价-原来的明细总价+现在的明细总价
                cart.setPrice(cart.getPrice() - oldPrice + newPrice);
                return;
            }
        }


        //如果明细中不存在对应的商品
        // 添加一条明细信息
        Item item = new Item();

        //新增的明细数量为1
        item.setNum(1);

        //新增的明细总价=商品单价
        item.setPrice(product.getPrice());

        //新增的商品就是当前的商品
        item.setProduct(product);

        //将新增的明细添加到购物车中去
        cart.addItem(item);

        // 购物车总价=原来的购物车总价+当前新增的明细的总价
        cart.setPrice(cart.getPrice() + item.getPrice());


    }

    @Override
    public void removeCart(Cart cart, Integer id) throws UserNotExistException, RequestParameterException {
        if (null == cart) {
            throw new UserNotExistException("请先登录");
        }
        if (null == id) {
            throw new RequestParameterException("请求参数有误");
        }
        List<Item> items=cart.getItems();
        for(int i=0;i<items.size();i++){
            Item item=items.get(i);
            //判断元素是否是需要删除的明细
            if (item.getProduct().getId().equals(id)){

                //购物车总价=购物车原来的总价-当前删除的明细的总价
                cart.setPrice(cart.getPrice()-item.getPrice());

                // 删除指定的明细
                cart.removeItem(item);
            }
        }

    }

    @Override
    public void modifyCart(Cart cart, Integer id, Integer num) throws UserNotExistException, RequestParameterException {
        if (null == cart) {
            throw new UserNotExistException("请先登录");
        }
        if (null == id || null==num) {
            throw new RequestParameterException("请求参数有误");
        }

        //查询指定商品的最新信息
        Product product=productDao.selectById(id);

        //购物车中所有的明细
        List<Item> items=cart.getItems();

        //遍历明细
        for(Item item:items){
            if(item.getProduct().getId().equals(product.getId())){

                //修改明细数量
                item.setNum(num);

                //获取明细原来的总价
                Double oldPrice=item.getPrice();

                //明细总价=当前商品单价*当前数量
                item.setPrice(product.getPrice()*item.getNum());

                //获取明细的新的总价
                Double newPrice=item.getPrice();


                // 购物车总价=购物车原来的总价-原来的明细总价+现在的明细总价
                cart.setPrice(cart.getPrice()-oldPrice+newPrice);
            }
        }


    }
}
